/**
 * comm.h
 * C 通用类型声明。*/

#ifndef COMM_H
#define COMM_H

#include <time.h>
#include <math.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#define CMIN(a, b)  ((a) < (b) ? (a) : (b))
#define CMAX(a, b)  ((a) > (b) ? (a) : (b))
#define CIF_RETURN(exps, ret) ({if (__glibc_unlikely(exps)) return ret;})

typedef union commData COMM_DATA_U;

/**
 * 常用状态
 * OK   正常；
 * ING  进行中；
 * DONE 完成；
 * OH   出错；
 * OM   无内存。*/
enum commStatus
{
    COK = 0,
    CING,
    CDONE,
    COH,
    COM,
};

/**
 * C 类型通用容纳类型。
 * a 地址；
 * d 双精度浮点；
 * s64 有符号 64 位整型；
 * u64 无符号 64 位整型。*/
union commData
{
    void    *a;
    double   d;
    int64_t  s64;
    uint64_t u64;
};

inline static uint64_t 
comm_getnsec(void)
{
    struct timespec tp = {0, };
    //clock_gettime(CLOCK_REALTIME, &tp);
    return tp.tv_sec * 1000000000 + tp.tv_nsec;
}
#endif